home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 140
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin
/
tools
/
dshell
/
dsh333bs.lzh
/
strsub.s
< prev
next >
Wrap
Text File
|
1999-07-11
|
2KB
|
137 lines
* dshell v3
*
* 文字列処理
.xdef _dinstr
.xdef _dinstrchr
.xdef _dstrupr
*
* int dinstr(const uchar *base, const uchar *pat);
*
* instr() の下位互換関数
* 文字列 base の先頭から文字列 pat と一致する部分を探し
* その位置(1~)を返す
* 一致する部分がなかった場合は 0 を返す
*
* int dinstrchr(const uchar *base, char chr);
*
* 文字列 base の先頭から1バイト文字 chr を探し
* その位置(1~)を返す
* 一致する部分がなかった場合は 0 を返す
*
SAVREGS reg d3-d4/a3
SAVSIZ set (2+1)*4
.offset SAVSIZ
_pc: .ds.l 1
base: .ds.l 1
pat: .ds.b 3 *┐
chr: .ds.b 1 *┘
.text
*
_dinstrchr:
movem.l SAVREGS,-(sp)
move.b chr(sp),d2
beq nmatch
moveq.l #-1,d3
bra search
_dinstr:
movem.l SAVREGS,-(sp)
movea.l pat(sp),a1 *a1 = パターン
move.b (a1)+,d2 *d2 = パターン先頭文字
beq nmatch *パターンが空文字列の場合は照合失敗扱い (旧版の仕様)
movea.l a1,a2
@@: tst.b (a2)+
bne @b
suba.l a1,a2
move.w a2,d3
subq.w #1+1,d3 *d3 = パターン長-1のdbraカウンタ
search: move.l base(sp),d1 *d1 = テキスト
movea.l d1,a0
loop1: move.b (a0)+,d0
beq nmatch
cmp.b d2,d0
bne loop1
move.w d3,d4
bmi @f
movea.l a0,a2
movea.l a1,a3
loop2: cmpm.b (a2)+,(a3)+
dbne d4,loop2
bne loop1
*仮照合完了↑
*2バイト文字の2バイト目から始まっていないことを確認
@@: lea.l -1(a0),a2
move.l a2,d4
sub.l d1,d4
bne next3
bra match
loop3H: swap.w d4
loop3L: move.b -(a2),d0
bpl @f
cmpi.b #$a0,d0
bcs next3
cmpi.b #$e0,d0
bcs @f
next3: dbra d4,loop3L
swap.w d4
dbra d4,loop3H
addq.l #1,a2
@@: move.w a2,d0
sub.w a0,d0
lsr.w #1,d0
bcs loop1
match: move.l a0,d0 *見つかった
sub.l d1,d0
retn: movem.l (sp)+,SAVREGS
rts
nmatch: moveq.l #0,d0 *見つからなかった (d0 = NULL)
bra retn
*
* uchar *dstrupr(uchar *str)
*
* X680x0 の2バイト文字を考慮した strupr()
*
.offset 4
str: .ds.l 1
.text
*
_dstrupr:
move.l str(sp),d0
movea.l d0,a0
moveq.l #$df,d2
bra upperNext
upperLoop: bmi @f
cmpi.b #'a',d1
bcs upperNext
cmpi.b #'z',d1
bhi upperNext
and.b d2,-1(a0)
move.b (a0)+,d1
bne upperLoop
bra upperRetn
@@: cmpi.b #$a0,d1
bcs @f
cmp.b d2,d1
bls upperNext
cmpi.b #$f6,d1
bcc upperNext
@@: tst.b (a0)+
beq upperRetn
upperNext: move.b (a0)+,d1
bne upperLoop
upperRetn: rts
.end